<?php
 
namespace app\index\service;

use think\Model;
use think\Cache;
use think\Config;
use alidayu\DaYu;
use think\Log;

class Sms extends Model
{
    //发送登录短信接口
    public function loginSms($phone) 
    {
        //检查手机号格式
        self::checkPhone($phone);
        //生成和检查验证码
        $code = self::getCode($phone);
        
        $config = Config::get('dayu');
        
        $smsSend = new DaYu($config['app_key'], $config['secret_key']);
        $send = ['number'=>$code];
        $url =  $smsSend->getUrl(
            $phone,
            $config['sign_name'],//短信签名
            $config['login_template'],//短信模板
            json_encode($send),
            rand(1111,9999)
        );// 这里的几个参数要改一下 ,倒数第二个参数 ，是对templateParam 进行json_encode后的字符串，是因为我的短信模板是"您的验证码是$code",所以我传的templateParam参数就是{"code":12345} .
        $response = httpGet($url);
        if ($response['Code'] != 'OK') {
            Log::record('验证码获取失败'.json_encode($response));
            throw new \think\Exception('验证码获取失败');
        }
        self::setCode($phone);
        return true;
    }
    /**
     * 记录获取验证码的频率和次数
     * @date: 2017年8月11日 下午10:57:33
     * @author: hxzlh
     * @param unknown $phone
     * @return: return
     */
    private static function setCode($phone) 
    {
        $config = Config::get('login_sms');
        $interval_key = $config['interval_key'].$phone;
        $times_key = $config['times_key'].$phone;
        $times = Cache::get($times_key) ?: 0;
        Cache::set($interval_key, 1, $config['interval_expire']);//设置验证码间隔
        Cache::set($times_key, $times+1, $config['login_expire']);//设置获取次数
    }
    //生成随机码,存入缓存
    private static function getCode($phone) 
    {
        $config = Config::get('login_sms');
        
        //检查验证码频率
        $interval_key = $config['interval_key'].$phone;
        if (Cache::has($interval_key)) {
            throw new \think\Exception('请一分钟后重试');
        }
        //检查获取验证码次数,10分钟内5次
        $times_key = $config['times_key'].$phone;
        $times = Cache::get($times_key) ?: 0;
        if ($times >= $config['times_limit']) {
            throw new \think\Exception('获取验证码频率太高,请稍后重试');
        }
        
        $loginKey = $config['login_key'].$phone;
        if (Cache::has($loginKey)) {
            Cache::rm($loginKey);
        }
        $code = mt_rand(10,99).mt_rand(10,99).mt_rand(10,99);//生成6位验证码
        Cache::set($loginKey, $code, $config['login_expire']);//设置验证码
        return $code;
    }
    //检查手机号
    private static function checkPhone($phone) 
    {
        if(!checkPhone($phone)){
            throw new \think\Exception('不是正确的手机号');
        }
        return true;
    }
    /**
     * 验证手机验证码
     * @date: 2017年8月11日 下午11:05:13
     * @author: hxzlh
     * @param unknown $phone
     * @param unknown $code
     * @throws \think\Exception
     * @return boolean
     */
    public static function checkCode($phone, $code) 
    {
        //检查手机号格式
        self::checkPhone($phone);
        $config = Config::get('login_sms');
        $loginKey = $config['login_key'].$phone;
        Log::record('loginKey:'.$loginKey);
        if (!Cache::has($loginKey)) {
            throw new \think\Exception('验证码过期,请重新获取');
        }
        $smsCode = Cache::get($loginKey);
        if ($smsCode != $code) {
            throw new \think\Exception('验证码不正确,请重新输入');
        }
        Cache::rm($loginKey);//删除验证码
        return true;
    }
}